package com.mall.module.system.service.Impl;

import com.mall.module.system.domain.entity.SysMenu;
import com.mall.module.system.domain.entity.SysPermission;
import com.mall.module.system.domain.vo.MenuVO;
import com.mall.module.system.mapper.SysMenuMapper;
import com.mall.module.system.mapper.SysPermissionMapper;
import com.mall.module.system.service.SysMenuService;
import com.mall.module.system.service.SysPermissionService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;

import java.util.*;
import java.util.stream.Collectors;

/**
 * 菜单服务实现类
 */
@Service
public class SysMenuServiceImpl implements SysMenuService {

    @Autowired
    private SysMenuMapper sysMenuMapper;
    
    @Autowired
    private SysPermissionService sysPermissionService;

    /**
     * 获取用户菜单列表
     *
     * @param userId 用户ID
     * @return 菜单列表
     */
    @Override
    public List<MenuVO> getMenuTreeByUserId(Long userId) {
        // 获取用户所有菜单
        List<SysMenu> menuList = sysMenuMapper.selectMenuTreeByUserId(userId);
        
        if (menuList == null || menuList.isEmpty()) {
            return new ArrayList<>();
        }
        
        return buildMenuTree(menuList);
    }
    
    /**
     * 构建菜单树
     *
     * @param menuList 菜单列表
     * @return 菜单树
     */
    private List<MenuVO> buildMenuTree(List<SysMenu> menuList) {
        // 将菜单转换为VO
        List<MenuVO> menuVOList = convertToMenuVO(menuList);
        
        // 构建菜单树
        Map<Long, MenuVO> menuMap = menuVOList.stream()
                .collect(Collectors.toMap(MenuVO::getId, menu -> menu));
                
        List<MenuVO> rootMenus = new ArrayList<>();
        
        menuVOList.forEach(menu -> {
            if (menu.getParentId() == 0) {
                // 根菜单
                rootMenus.add(menu);
            } else {
                // 子菜单
                MenuVO parentMenu = menuMap.get(menu.getParentId());
                if (parentMenu != null) {
                    if (parentMenu.getChildren() == null) {
                        parentMenu.setChildren(new ArrayList<>());
                    }
                    parentMenu.getChildren().add(menu);
                }
            }
        });
        
        // 对菜单进行排序
        sortMenuList(rootMenus);
        
        return rootMenus;
    }
    
    /**
     * 将菜单转换为VO
     *
     * @param menuList 菜单列表
     * @return VO列表
     */
    private List<MenuVO> convertToMenuVO(List<SysMenu> menuList) {
        return menuList.stream().map(menu -> {
            MenuVO menuVO = new MenuVO();
            menuVO.setId(menu.getId());
            menuVO.setParentId(menu.getParentId());
            menuVO.setPath(menu.getPath());
            menuVO.setComponent(menu.getComponent());
            
            // 生成路由名称（英文驼峰）
            String routeName = generateRouteName(menu.getName());
            menuVO.setName(routeName);
            
            // 设置元数据
            MenuVO.MenuMetaVO meta = new MenuVO.MenuMetaVO();
            meta.setTitle(menu.getName());
            meta.setIcon(menu.getIcon());
            meta.setHidden(menu.getStatus() == 0);
            
            // 获取权限标识
            if (menu.getPermissionId() != null) {
                String permissionKey = sysPermissionService.getPermissionKeyById(menu.getPermissionId());
                meta.setPermissionKey(permissionKey);
            }
            
            // 子菜单为1个时是否始终显示父菜单
            meta.setAlwaysShow(true);
            
            menuVO.setMeta(meta);
            menuVO.setOrderNum(menu.getOrderNum());
            
            return menuVO;
        }).collect(Collectors.toList());
    }
    
    /**
     * 生成路由名称（简单的英文驼峰转换）
     *
     * @param name 菜单名称
     * @return 路由名称
     */
    private String generateRouteName(String name) {
        // 简单处理，实际项目中可能需要更复杂的处理
        if (name == null || name.isEmpty()) {
            return "Menu";
        }
        
        // 将常见中文转为英文（实际应用中应当有完整的映射表）
        Map<String, String> nameMap = new HashMap<>();
        nameMap.put("系统管理", "System");
        nameMap.put("用户管理", "User");
        nameMap.put("角色管理", "Role");
        nameMap.put("权限管理", "Permission");
        nameMap.put("菜单管理", "Menu");
        nameMap.put("部门管理", "Dept");
        nameMap.put("商品管理", "Product");
        nameMap.put("订单管理", "Order");
        
        if (nameMap.containsKey(name)) {
            return nameMap.get(name);
        }
        
        // 默认名称处理
        return name.replaceAll("[^a-zA-Z0-9]", "");
    }
    
    /**
     * 菜单排序
     *
     * @param menuList 菜单列表
     */
    private void sortMenuList(List<MenuVO> menuList) {
        if (menuList == null) {
            return;
        }
        
        // 根据orderNum排序
        menuList.sort(Comparator.comparing(MenuVO::getOrderNum));
        
        // 对子菜单排序
        for (MenuVO menu : menuList) {
            if (menu.getChildren() != null && !menu.getChildren().isEmpty()) {
                sortMenuList(menu.getChildren());
            }
        }
    }
} 